<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>syn攻击和防御</title>
    <style>
        body{background-color: #c7edcc}
    </style>
</head>
<body>
<pre>

    TCP连接需要三次握手
    第一次:客户端发出syn 随机一个序列号j
    第二次:服务器返回ack=j+1,并发出一个syn,随机序列号i
    第三次:客户端再次确认, 三次握手完成

   1. 为什么需要三次握手?
        如果采用两次握手,当客户端第一次发出syn, 服务器响应, 如果网络不好没有得到服务器响应,客户端会再次重发
    当先前发送的syn到达服务器,服务器做出响应,三次握手客户端不会对该响应进行响应, 两次握手的话服务器就会认为
    连接成功建立. 三次握手如果所有客户端网络不好会造成类似syn攻击的效果,会有大量半连接状态的连接在未连接队列
    中,可以把队列值设大点,也可以把未连接队列里面的超时值设置得小一些,还有SYN Cookie预防syn flood

   2.关于backlog参数
        在编写网络程序,有时需要设置backlog参数,该参数是指定

   3.SYN Cookie原理

    查看是否启用 cat /proc/sys/net/ipv4/tcp_syncookies 1表示启用 0表示未启用

    http://blog.csdn.net/zhangskd/article/details/16986931

    SYN Flood

    下面这段介绍引用自[1].
    SYN Flood是一种非常危险而常见的Dos攻击方式。到目前为止，能够有效防范SYN Flood攻击的手段并不多，
    SYN Cookie就是其中最著名的一种。

    SYN Flood攻击是一种典型的拒绝服务(Denial of Service)攻击。所谓的拒绝服务攻击就是通过进行攻击，使受害主机或
    网络不能提供良好的服务，从而间接达到攻击的目的。
    SYN Flood攻击利用的是IPv4中TCP协议的三次握手(Three-Way Handshake)过程进行的攻击。
    TCP服务器收到TCP SYN request包时，在发送TCP SYN + ACK包回客户机前，TCP服务器要先分配好一个数据区专门
    服务于这个即将形成的TCP连接。一般把收到SYN包而还未收到ACK包时的连接状态称为半打开连接(Half-open Connection)。
    在最常见的SYN Flood攻击中，攻击者在短时间内发送大量的TCP SYN包给受害者。受害者(服务器)为每个TCP SYN包分配
    一个特定的数据区，只要这些SYN包具有不同的源地址(攻击者很容易伪造)。这将给TCP服务器造成很大的系统负担，最终
    导致系统不能正常工作。

    SYN Cookie

    SYN Cookie原理由D.J. Bernstain和Eric Schenk提出。
    SYN Cookie是对TCP服务器端的三次握手做一些修改，专门用来防范SYN Flood攻击的一种手段。它的原理是，在TCP服务器
    接收到TCP SYN包并返回TCP SYN + ACK包时，不分配一个专门的数据区，而是根据这个SYN包计算出一个cookie值。这个
    cookie作为将要返回的SYN ACK包的初始序列号。当客户端返回一个ACK包时，根据包头信息计算cookie，与返回的确认序列
    号(初始序列号 + 1)进行对比，如果相同，则是一个正常连接，然后，分配资源，建立连接。

    实现的关键在于cookie的计算，cookie的计算应该包含本次连接的状态信息，使攻击者不能伪造。
    cookie的计算：
    服务器收到一个SYN包，计算一个消息摘要mac。
    mac = MAC(A, k);
    MAC是密码学中的一个消息认证码函数，也就是满足某种安全性质的带密钥的hash函数，它能够提供cookie计算中需要的安全性。
    在Linux实现中，MAC函数为SHA1。
    A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND
    k为服务器独有的密钥，实际上是一组随机数。
    t为系统启动时间，每60秒加1。
    MSSIND为MSS对应的索引。


</pre>
</body>
</html>